/**
 * \file    链表头文件
*/

#ifndef LINK_link_list_H
#define LINK_link_list_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stddef.h>
#include "alg_errno.h"

typedef int data_type;
typedef struct _link_list link_list;

/**
 * \brief           句柄初始化
 * 
 * \warning         ctx必须为二级指针，为了防止内存泄漏，请保证ctx为NULL
 * 
 * \param ctx[out]  初始化句柄
 * 
 * \return          \c ALG_OK 初始化成功
*/
int link_list_init(link_list **ctx);

/**
 * \brief           头部添加一个节点
 * 
 * \param ctx[in]   指针句柄
 * \param data[in]  待插入数据
 * 
 * \return          \c ALG_OK 添加成功
*/
int link_list_add_head(link_list *ctx, data_type data);

/**
 * \brief           尾部添加一个节点
 * 
 * \param ctx[in]   指针句柄
 * \param data[in]  待插入数据
 * 
 * \return          \c ALG_OK 添加成功
*/
int link_list_add_rear(link_list *ctx, data_type data);

/**
 * \brief           删除链表中第一个为target的元素
 * 
 * \param ctx[in]   指针句柄
 * \param target[in] 目标元素
 * 
 * \return          \c ALG_OK 删除成功
*/
int link_list_delete_first_target(link_list *ctx, data_type target);

/**
 * \brief           清空链表中的元素
 * 
 * \param ctx[in]   指针句柄
 * 
 * \return          \c ALG_OK 执行成功
*/
int link_list_clean(link_list *ctx);

/**
 * \brief           打印链表中的所有内容
 * 
 * \param ctx[in]   指针句柄
 * 
 * \return          \c ALG_OK 打印完毕
*/
int link_list_show(link_list *ctx);

#ifdef __cplusplus
}
#endif

#endif